#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;

const int F=5555;

int doit[F],num[F],head[F],tot;

double ans,w[F],dis[F];

bool vis[F];

struct Edge{
	int to;
	int dis;
	int next;
}edge[F];

int add(int x,int y,int z) 
{
	edge[++tot].to=y;
	edge[tot].dis=z;
	edge[tot].next=head[x];
	head[x]=tot;
}

bool spfa(int x) 
{
	vis[x]=true;
	for(int i=head[x];i;i=edge[i].next) 
	{
		int t=edge[i].to;
		if(dis[t]>dis[x]+w[i]) 
		{
			dis[t]=dis[x]+w[i];
			if(vis[t]||spfa(t)) 
			{
				vis[x]=false;
				return true;
			}
		}
	}
	vis[x]=false;
	return false;
}

int n,m;

bool judge() 
{
	for(int i=1;i<=n;i++)
		if(spfa(i)) 
			return true;
	return false;
}

inline int read()
{
	int X=0; 
	bool flag=1; 
	char ch=getchar();
	while(ch<'0'||ch>'9') 
	{
		if(ch=='-') 
			flag=0; 
		ch=getchar();
	}
	while(ch>='0'&&ch<='9') 
	{
		X=(X<<1)+(X<<3)+ch-'0'; 
		ch=getchar();
	}
	if(flag) 
		return X;
	return 
		(X-1);
}

int main()
{
	n=read(),m=read();
	for(int i=1;i<=n;i++)
		doit[i]=read();
	for(int i=1;i<=m;i++)
	{
		int x=read(),y=read(),z=read();
		add(x,y,z);
	}
	double l=0,r=20000;
	while(r-l>0.000000001)
	{
		double mid=(l+r)/2;
		for(int i=1;i<=tot;i++)
		{
			int temp=edge[i].to;
			w[i]=(double)mid*edge[i].dis-doit[temp];
		}
		if(judge()) 
		{
			ans=mid;
			l=mid;
		} 
		else 
			r=mid;
	}
	printf("%.2lf",ans);
	return 0;
}